package src.main.java.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

import src.main.java.entity.Ocorrencia;
import src.main.java.entity.Pessoa;
import src.main.java.entity.ScoreCalc;
import src.main.java.entity.TipoOcorrencia;

public class PessoaDAO {
	
	public Pessoa getPessoaByCpf(Long cpf){
		Pessoa p = null;
		try{
			
			String query = "SELECT cpf, score, removido FROM pessoa WHERE removido = false and cpf = " + cpf;
			
			Connection con = getConnection();
			Statement stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery(query);
			
			while(rs.next()){
				p = new Pessoa();
				p.setCpf(rs.getLong("cpf"));
				p.setRemovido(false);
				p.setScore(rs.getString("score"));
				//efetua o calculo do score
				Ocorrencia o = new Ocorrencia();
				o.setCpf(cpf);
				OcorrenciaDAO od = new OcorrenciaDAO();
				String scoreCalculado = ScoreCalc.calculaScore(p, od.listOcorrencia(o));
				p.setScore(scoreCalculado);
			}

			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return p;
	}
	
	public boolean savePessoa(Pessoa p){
		try{
			String query = "INSERT INTO pessoa VALUES("
				+ p.getCpf() + ", " 
				+ "'" + p.getScore()  + "', "
				+ "false)";
				
			Connection con = getConnection();
			Statement stmt = con.createStatement();
			stmt.executeUpdate(query);

			System.out.println("Save Pessoa executado");

			con.close();
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
	
	public boolean editPessoa(Pessoa p){
		try{
			
			String query = "UPDATE pessoa set";
			if(p!= null && p.getScore() != null){
				query += " score = '" + p.getScore() + "'";
			}
			query += " where cpf =" + p.getCpf() + "";
			
			Connection con = getConnection();
			Statement stmt = con.createStatement();
			stmt.executeUpdate(query);

			System.out.println("Update Pessoa executado");

			con.close();
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
	
	public boolean removePessoa(Pessoa p){
		try{
			
			String query = "UPDATE pessoa set removido = true where cpf = " + p.getCpf();
			
			Connection con = getConnection();
			Statement stmt = con.createStatement();
			stmt.executeUpdate(query);

			System.out.println("Remove Pessoa executado");

			con.close();
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
	
	public ArrayList<Pessoa> listPessoa(Pessoa p, Boolean temOcorrencia){
		ArrayList<Pessoa> listPessoa = new ArrayList<Pessoa>();
		try{
			
			String query = "SELECT cpf, removido, score FROM pessoa WHERE removido = false";
			
			if(p!=null && p.getCpf() != null)
				query += " AND cpf = " + p.getCpf();
			if(p!=null && p.getScore() != null && !p.getScore().isEmpty())
				query += " AND score = '" + p.getScore() +"'";
			

			Connection con = getConnection();
			Statement stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery(query);
			
			while(rs.next()){
				Pessoa pessoa = new Pessoa();
				pessoa.setCpf(rs.getLong("cpf"));
				pessoa.setRemovido(false);
				pessoa.setScore(rs.getString("score"));
				//efetua o calculo do score
				Ocorrencia o = new Ocorrencia();
				o.setCpf(pessoa.getCpf());
				OcorrenciaDAO od = new OcorrenciaDAO();
				String scoreCalculado = ScoreCalc.calculaScore(pessoa, od.listOcorrencia(o));
				pessoa.setScore(scoreCalculado);
				
				if (temOcorrencia == null || (temOcorrencia && pessoaTemOcorrencia(pessoa.getCpf()) || (!temOcorrencia && !pessoaTemOcorrencia(pessoa.getCpf()))))
						listPessoa.add(pessoa);
			}

			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return listPessoa;
	}
	
	private Boolean pessoaTemOcorrencia(Long cpf) throws Exception{
		String query = "SELECT cpf FROM ocorrencia WHERE removido = false and cpf = " + cpf;
		
		Connection con = getConnection();
		Statement stmt = con.createStatement();
		ResultSet rs = stmt.executeQuery(query);
		
		return rs.next();
	}
	
	private Connection getConnection() throws Exception {
		Class.forName("org.postgresql.Driver");
		Connection con = DriverManager.getConnection("jdbc:postgresql://localhost:5432/mc437","postgres","postgres");
//		Connection con = DriverManager.getConnection("jdbc:postgresql://staff01.lab.ic.unicamp.br:5432/grupo4","grupo4","ep:eik4Xu5");
		return con;
	}

}